{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "NLTK 工具包安装    \n",
    "非常实用的文本处理工具，主要用于英文数据"
   ],
   "id": "fd4543cfc69f2e0d"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.471861Z",
     "start_time": "2025-09-15T07:39:22.754599Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import nltk\n",
    "nltk.download()"
   ],
   "id": "12cd1f2075ca8e79",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "showing info https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 33
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.480442Z",
     "start_time": "2025-09-15T07:39:26.472978Z"
    }
   },
   "cell_type": "code",
   "source": "nltk.download('punkt_tab')",
   "id": "db64d7964c118d65",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[nltk_data] Downloading package punkt_tab to\n",
      "[nltk_data]     D:\\software\\python\\Lib\\NTLK...\n",
      "[nltk_data]   Package punkt_tab is already up-to-date!\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 34
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.487326Z",
     "start_time": "2025-09-15T07:39:26.481883Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 添加自定义的 NLTK 数据存储路径\n",
    "custom_path = \"D:\\\\software\\\\python\\\\Lib\\\\NTLK\"  # 替换为你的实际路径\n",
    "nltk.data.path.append(custom_path)\n",
    "# 验证是否添加成功\n",
    "print(nltk.data.path)  # 查看所有搜索路径，确认自定义路径已在其中"
   ],
   "id": "e16141c534c5745b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['C:\\\\Users\\\\17333/nltk_data', 'D:\\\\software\\\\Anaconda3\\\\envs\\\\d2l-zh\\\\nltk_data', 'D:\\\\software\\\\Anaconda3\\\\envs\\\\d2l-zh\\\\share\\\\nltk_data', 'D:\\\\software\\\\Anaconda3\\\\envs\\\\d2l-zh\\\\lib\\\\nltk_data', 'C:\\\\Users\\\\17333\\\\AppData\\\\Roaming\\\\nltk_data', 'C:\\\\nltk_data', 'D:\\\\nltk_data', 'E:\\\\nltk_data', 'D:\\\\software\\\\python\\\\Lib\\\\NTLK', 'D:\\\\software\\\\python\\\\Lib\\\\NTLK']\n"
     ]
    }
   ],
   "execution_count": 35
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "**分词**",
   "id": "4b72c48be1d86027"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.492329Z",
     "start_time": "2025-09-15T07:39:26.488653Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from nltk.tokenize import word_tokenize\n",
    "from nltk.text import Text"
   ],
   "id": "5c53c0aa12a1e1c",
   "outputs": [],
   "execution_count": 36
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.497090Z",
     "start_time": "2025-09-15T07:39:26.493727Z"
    }
   },
   "cell_type": "code",
   "source": "input_str = \"Today's weather is good, very windy and sunny, we have no classes in the afternoon,We have to play basketball tomorrow.\"",
   "id": "831dd8adf0d7f2c4",
   "outputs": [],
   "execution_count": 37
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.502522Z",
     "start_time": "2025-09-15T07:39:26.497090Z"
    }
   },
   "cell_type": "code",
   "source": "tokens = word_tokenize(input_str)",
   "id": "6618c59c4d4db405",
   "outputs": [],
   "execution_count": 38
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.508088Z",
     "start_time": "2025-09-15T07:39:26.502522Z"
    }
   },
   "cell_type": "code",
   "source": [
    "tokens = [ word.lower() for word in tokens]\n",
    "tokens[:5]"
   ],
   "id": "ec48a2970c81c33d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['today', \"'s\", 'weather', 'is', 'good']"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 39
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "**Text对象**   \n",
    "创建一个Text对象，方便后续操作"
   ],
   "id": "1a2f610272e50971"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.514098Z",
     "start_time": "2025-09-15T07:39:26.509122Z"
    }
   },
   "cell_type": "code",
   "source": "t = Text(tokens)",
   "id": "39ca98f6664b100",
   "outputs": [],
   "execution_count": 40
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.520268Z",
     "start_time": "2025-09-15T07:39:26.515618Z"
    }
   },
   "cell_type": "code",
   "source": "t.count('good')#记录次数",
   "id": "5faae70d764a00c1",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 41
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:26.527140Z",
     "start_time": "2025-09-15T07:39:26.522308Z"
    }
   },
   "cell_type": "code",
   "source": "t.index('good')#位置",
   "id": "b241125e4ffc4dd9",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 42
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:39:54.216961Z",
     "start_time": "2025-09-15T07:39:53.620397Z"
    }
   },
   "cell_type": "code",
   "source": "t.plot(8)",
   "id": "ba48adc6f4c9ce62",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='Samples', ylabel='Counts'>"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 43
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "**停用词**",
   "id": "58ce84ac5952d28"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:41:34.635616Z",
     "start_time": "2025-09-15T07:41:34.630537Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from nltk.corpus import stopwords\n",
    "stopwords.readme().replace('\\n', ' ')"
   ],
   "id": "282dd839b76786e0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Stopwords Corpus  This corpus contains lists of stop words for several languages.  These are high-frequency grammatical words which are usually ignored in text retrieval applications.  They were obtained from: http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/snowball/stopwords/  The stop words for the Romanian language were obtained from: http://arlc.ro/resources/  The English list has been augmented https://github.com/nltk/nltk_data/issues/22  The German list has been corrected https://github.com/nltk/nltk_data/pull/49  A Kazakh list has been added https://github.com/nltk/nltk_data/pull/52  A Nepali list has been added https://github.com/nltk/nltk_data/pull/83  An Azerbaijani list has been added https://github.com/nltk/nltk_data/pull/100  A Greek list has been added https://github.com/nltk/nltk_data/pull/103  An Indonesian list has been added https://github.com/nltk/nltk_data/pull/112 '"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 45
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:41:50.435096Z",
     "start_time": "2025-09-15T07:41:50.429784Z"
    }
   },
   "cell_type": "code",
   "source": "stopwords.fileids()",
   "id": "f9c5fa86c75bb6e2",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['albanian',\n",
       " 'arabic',\n",
       " 'azerbaijani',\n",
       " 'basque',\n",
       " 'belarusian',\n",
       " 'bengali',\n",
       " 'catalan',\n",
       " 'chinese',\n",
       " 'danish',\n",
       " 'dutch',\n",
       " 'english',\n",
       " 'finnish',\n",
       " 'french',\n",
       " 'german',\n",
       " 'greek',\n",
       " 'hebrew',\n",
       " 'hinglish',\n",
       " 'hungarian',\n",
       " 'indonesian',\n",
       " 'italian',\n",
       " 'kazakh',\n",
       " 'nepali',\n",
       " 'norwegian',\n",
       " 'portuguese',\n",
       " 'romanian',\n",
       " 'russian',\n",
       " 'slovene',\n",
       " 'spanish',\n",
       " 'swedish',\n",
       " 'tajik',\n",
       " 'tamil',\n",
       " 'turkish']"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 46
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:43:14.214118Z",
     "start_time": "2025-09-15T07:43:14.208055Z"
    }
   },
   "cell_type": "code",
   "source": "stopwords.raw('english').replace('\\n',' ')",
   "id": "eabc86b0d9d4c41f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"a about above after again against ain all am an and any are aren aren't as at be because been before being below between both but by can couldn couldn't d did didn didn't do does doesn doesn't doing don don't down during each few for from further had hadn hadn't has hasn hasn't have haven haven't having he he'd he'll her here hers herself he's him himself his how i i'd if i'll i'm in into is isn isn't it it'd it'll it's its itself i've just ll m ma me mightn mightn't more most mustn mustn't my myself needn needn't no nor not now o of off on once only or other our ours ourselves out over own re s same shan shan't she she'd she'll she's should shouldn shouldn't should've so some such t than that that'll the their theirs them themselves then there these they they'd they'll they're they've this those through to too under until up ve very was wasn wasn't we we'd we'll we're were weren weren't we've what when where which while who whom why will with won won't wouldn wouldn't y you you'd you'll your you're yours yourself yourselves you've \""
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 51
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:44:27.116634Z",
     "start_time": "2025-09-15T07:44:27.112603Z"
    }
   },
   "cell_type": "code",
   "source": [
    "test_words = [word.lower() for word in tokens]\n",
    "test_words_set = set(test_words)"
   ],
   "id": "4c33f0fe93757907",
   "outputs": [],
   "execution_count": 52
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:44:54.903134Z",
     "start_time": "2025-09-15T07:44:54.896641Z"
    }
   },
   "cell_type": "code",
   "source": "test_words_set.intersection(set(stopwords.words('english')))",
   "id": "7a8dc22121343d15",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'and', 'have', 'in', 'is', 'no', 'the', 'to', 'very', 'we'}"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 53
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#### 过滤掉停用词",
   "id": "c0ed0cb6935863c1"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:46:17.192501Z",
     "start_time": "2025-09-15T07:46:17.185593Z"
    }
   },
   "cell_type": "code",
   "source": "filtered = [w for w in test_words_set if(w not in stopwords.words('english'))]",
   "id": "6a0ea40f5a57f2cf",
   "outputs": [],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:46:17.684436Z",
     "start_time": "2025-09-15T07:46:17.680205Z"
    }
   },
   "cell_type": "code",
   "source": "filtered ",
   "id": "3eec122ebb782aca",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['today',\n",
       " \"'s\",\n",
       " 'tomorrow',\n",
       " 'play',\n",
       " 'afternoon',\n",
       " 'good',\n",
       " ',',\n",
       " 'windy',\n",
       " '.',\n",
       " 'classes',\n",
       " 'weather',\n",
       " 'sunny',\n",
       " 'basketball']"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 55
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#### 词性标注",
   "id": "f1c000bd2d576aa"
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "CC     coordinatingconjunction 并列连词\n",
    "\n",
    "CD     cardinaldigit  纯数  基数\n",
    "\n",
    "DT     determiner  限定词（置于名词前起限定作用，如 the、some、my 等）\n",
    "\n",
    "EX     existentialthere (like:\"there is\"... think of it like \"thereexists\")   存在句；存现句\n",
    "\n",
    "FW     foreignword  外来语；外来词；外文原词\n",
    "\n",
    "IN     preposition/subordinating conjunction介词/从属连词；主从连词；从属连接词\n",
    "\n",
    "JJ     adjective    'big'  形容词\n",
    "\n",
    "JJR    adjective, comparative 'bigger' （形容词或副词的）比较级形式\n",
    "\n",
    "JJS    adjective, superlative 'biggest'  （形容词或副词的）最高级\n",
    "\n",
    "LS     listmarker  1)\n",
    "\n",
    "MD     modal (could, will) 形态的，形式的 , 语气的；情态的\n",
    "\n",
    "NN     noun, singular 'desk' 名词单数形式\n",
    "\n",
    "NNS    nounplural  'desks'  名词复数形式\n",
    "\n",
    "NNP    propernoun, singular     'Harrison' 专有名词\n",
    "\n",
    "NNPS  proper noun, plural 'Americans'  专有名词复数形式\n",
    "\n",
    "PDT    predeterminer      'all the kids'  前位限定词\n",
    "\n",
    "POS    possessiveending  parent's   属有词  结束语\n",
    "\n",
    "PRP    personalpronoun   I, he, she  人称代词\n",
    "\n",
    "PRP$  possessive pronoun my, his, hers  物主代词\n",
    "\n",
    "RB     adverb very, silently, 副词    非常  静静地\n",
    "\n",
    "RBR    adverb,comparative better   （形容词或副词的）比较级形式\n",
    "\n",
    "RBS    adverb,superlative best    （形容词或副词的）最高级\n",
    "\n",
    "RP     particle     give up 小品词(与动词构成短语动词的副词或介词)\n",
    "\n",
    "TO     to    go 'to' the store.\n",
    "\n",
    "UH     interjection errrrrrrrm  感叹词；感叹语\n",
    "\n",
    "VB     verb, baseform    take   动词\n",
    "\n",
    "VBD    verb, pasttense   took   动词   过去时；过去式\n",
    "\n",
    "VBG    verb,gerund/present participle taking 动词  动名词/现在分词\n",
    "\n",
    "VBN    verb, pastparticiple     taken 动词  过去分词\n",
    "\n",
    "VBP    verb,sing. present, non-3d     take 动词  现在\n",
    "\n",
    "VBZ    verb, 3rdperson sing. present  takes   动词  第三人称\n",
    "\n",
    "WDT    wh-determiner      which 限定词（置于名词前起限定作用，如 the、some、my 等）\n",
    "\n",
    "WP     wh-pronoun   who, what 代词（代替名词或名词词组的单词）\n",
    "\n",
    "WP$    possessivewh-pronoun     whose  所有格；属有词\n",
    "\n",
    "WRB    wh-abverb    where, when 副词"
   ],
   "id": "4baada3aa2808b5"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:49:49.615230Z",
     "start_time": "2025-09-15T07:49:49.485613Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from nltk import pos_tag\n",
    "tags = pos_tag(tokens)\n",
    "tags"
   ],
   "id": "8f534812a9934bff",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('today', 'NN'),\n",
       " (\"'s\", 'POS'),\n",
       " ('weather', 'NN'),\n",
       " ('is', 'VBZ'),\n",
       " ('good', 'JJ'),\n",
       " (',', ','),\n",
       " ('very', 'RB'),\n",
       " ('windy', 'JJ'),\n",
       " ('and', 'CC'),\n",
       " ('sunny', 'JJ'),\n",
       " (',', ','),\n",
       " ('we', 'PRP'),\n",
       " ('have', 'VBP'),\n",
       " ('no', 'DT'),\n",
       " ('classes', 'NNS'),\n",
       " ('in', 'IN'),\n",
       " ('the', 'DT'),\n",
       " ('afternoon', 'NN'),\n",
       " (',', ','),\n",
       " ('we', 'PRP'),\n",
       " ('have', 'VBP'),\n",
       " ('to', 'TO'),\n",
       " ('play', 'VB'),\n",
       " ('basketball', 'NN'),\n",
       " ('tomorrow', 'NN'),\n",
       " ('.', '.')]"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 56
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "分块",
   "id": "f4c3741f12c44bb2"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:56:42.329802Z",
     "start_time": "2025-09-15T07:56:42.326927Z"
    }
   },
   "cell_type": "code",
   "source": "from nltk.chunk import RegexpParser",
   "id": "dc69b8a53765e21f",
   "outputs": [],
   "execution_count": 58
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T07:58:31.484576Z",
     "start_time": "2025-09-15T07:56:43.378551Z"
    }
   },
   "cell_type": "code",
   "source": [
    "sentence = [('the','DT'),('little','JJ'),('yellow','JJ'),('dog','NN'),('died','VBD')]\n",
    "grammer = \"MY_NP: {<DT>?<JJ>*<NN>}\"\n",
    "cp = nltk.RegexpParser(grammer) #生成规则\n",
    "result = cp.parse(sentence) #进行分块\n",
    "print(result)\n",
    "result.draw() #调用 matplotlib 库画出来"
   ],
   "id": "423bc27d2234bf98",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(S (MY_NP the/DT little/JJ yellow/JJ dog/NN) died/VBD)\n"
     ]
    }
   ],
   "execution_count": 59
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "命名实体识别",
   "id": "e2bd52db5d676b70"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T08:01:35.171463Z",
     "start_time": "2025-09-15T08:01:34.905960Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from nltk import ne_chunk\n",
    "sentence = \"Edison went to Tsinghua University today.\"\n",
    "print(ne_chunk(pos_tag(word_tokenize(sentence))))"
   ],
   "id": "8ed9322ab1452b59",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(S\n",
      "  (PERSON Edison/NNP)\n",
      "  went/VBD\n",
      "  to/TO\n",
      "  (ORGANIZATION Tsinghua/NNP University/NNP)\n",
      "  today/NN\n",
      "  ./.)\n"
     ]
    }
   ],
   "execution_count": 60
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "数据清洗实例",
   "id": "79fd0ea34a05d311"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T08:27:51.143471Z",
     "start_time": "2025-09-15T08:27:51.137800Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import re\n",
    "from nltk.corpus import stopwords\n",
    "#输入数据\n",
    "s  = '    RT @Amila #Test\\nTom\\'s newly listed Co &amp; Mary\\'s unlisted     Group to supply tech for nlTK. \\nh $TSLA $AAPL https:// t.co/x34afsfQsh'\n",
    "#指定停用词\n",
    "cache_english_stopwords = stopwords.words('english')\n",
    "def text_clean(text):\n",
    "    print('原始数据：',text,'\\n')\n",
    "     \n",
    "    # 去掉HTML标签（&amp;等字符）、@开头内容、#开头内容\n",
    "    # 正则解释：\n",
    "    # &\\w+;：匹配&开头，接着若干字母数字，以;结尾的HTML实体（如&amp;）\n",
    "    # |：或\n",
    "    # @\\w+：匹配@开头，接着若干字母数字的内容\n",
    "    # |：或\n",
    "    # #\\w+：匹配#开头，接着若干字母数字的内容\n",
    "    text_no_special_entities = re.sub(r'&\\w+;|@\\w+|#\\w+', '', text) \n",
    "    print('去除掉特殊标签后：',text_no_special_entities,'\\n')\n",
    "    \n",
    "    #去掉一些价值符号\n",
    "    text_no_tickers = re.sub(r'\\$\\w*','',text_no_special_entities)\n",
    "    print('去除掉价值符号后：',text_no_tickers,'\\n')\n",
    "    # 去掉超链接\n",
    "    text_no_hyperlinks = re.sub(r'https?:\\/\\/.*\\/\\w*', '', text_no_tickers)\n",
    "    print('去掉超链接后的:', text_no_hyperlinks, '\\n')\n",
    "\n",
    "    # 去掉一些专门名词缩写，简单来说就是字母比较少的词\n",
    "    text_no_small_words = re.sub(r'\\b\\w{1,2}\\b', '', text_no_hyperlinks)\n",
    "    print('去掉专门名词缩写后:', text_no_small_words, '\\n')\n",
    "    \n",
    "    # 去掉多余的空格\n",
    "    text_no_whitespace = re.sub(r'\\s\\s+', ' ', text_no_small_words)\n",
    "    text_no_whitespace = text_no_whitespace.lstrip(' ')\n",
    "    print('去掉空格后的:', text_no_whitespace, '\\n')\n",
    "    \n",
    "    # 分词\n",
    "    tokens = word_tokenize(text_no_whitespace)\n",
    "    print('分词结果:', tokens, '\\n')\n",
    "    \n",
    "    # 去停用词\n",
    "    list_no_stopwords = [i for i in tokens if i not in cache_english_stopwords]\n",
    "    print('去停用词后结果:', list_no_stopwords, '\\n')\n",
    "    # 过滤后结果\n",
    "    text_filtered = ' '.join(list_no_stopwords) # ''.join() would join without spaces between words.\n",
    "    print('过滤后:', text_filtered)\n",
    "\n",
    "text_clean(s)"
   ],
   "id": "d14305c994af02a7",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始数据：     RT @Amila #Test\n",
      "Tom's newly listed Co &amp; Mary's unlisted     Group to supply tech for nlTK. \n",
      "h $TSLA $AAPL https:// t.co/x34afsfQsh \n",
      "\n",
      "去除掉特殊标签后：     RT  \n",
      "Tom's newly listed Co  Mary's unlisted     Group to supply tech for nlTK. \n",
      "h $TSLA $AAPL https:// t.co/x34afsfQsh \n",
      "\n",
      "去除掉价值符号后：     RT  \n",
      "Tom's newly listed Co  Mary's unlisted     Group to supply tech for nlTK. \n",
      "h   https:// t.co/x34afsfQsh \n",
      "\n",
      "去掉超链接后的:     RT  \n",
      "Tom's newly listed Co  Mary's unlisted     Group to supply tech for nlTK. \n",
      "h    \n",
      "\n",
      "去掉专门名词缩写后:       \n",
      "Tom' newly listed   Mary' unlisted     Group  supply tech for nlTK. \n",
      "    \n",
      "\n",
      "去掉空格后的: Tom' newly listed Mary' unlisted Group supply tech for nlTK.  \n",
      "\n",
      "分词结果: ['Tom', \"'\", 'newly', 'listed', 'Mary', \"'\", 'unlisted', 'Group', 'supply', 'tech', 'for', 'nlTK', '.'] \n",
      "\n",
      "去停用词后结果: ['Tom', \"'\", 'newly', 'listed', 'Mary', \"'\", 'unlisted', 'Group', 'supply', 'tech', 'nlTK', '.'] \n",
      "\n",
      "过滤后: Tom ' newly listed Mary ' unlisted Group supply tech nlTK .\n"
     ]
    }
   ],
   "execution_count": 65
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": "",
   "id": "18b93e62590445f0"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
